/** Fichier définissant un icosaèdre.
 *
 * Ce fichier contient la définition de la classe Icosaedre.
 *
 * @file Icosaedre.hpp
 * @author Johan "Solo" Luisier
 * @date 2010
 */
#ifndef ICOSAEDRE_H
#define ICOSAEDRE_H

#include "FormeComposee.hpp"

#include "Plan.hpp"

#include <vector>

/** Classe implémentant l'icosaèdre pour le raytracing.
 *
 * Cette classe implémente l'icosaèdre pour le raytracing. En fait c'est un
 * coup de pot : l'icosaèdre est le dual du dodécaèdre, ce qui veut dire qu'à
 * chaque sommet du docécaèdre correspond une face de l'icosaèdre et
 * vice-versa. En cherchant comment implémenter le dodecaèdre j'ai trouvé
 * comment faire un icosaèdre, que j'avais l'intention de réaliser plus tard.
 *
 * L'icosaèdre est défini par 20 faces qu'il est "très facile" d'exprimer dans
 * les coordonées locales, par rapport au centre de gravité du solide.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 2010
 *
 * @class Icosaedre "Icosaedre.hpp" "Formes/Icosaedre.hpp"
 */
class Icosaedre : public FormeComposee
{
public:
    Icosaedre(const Coord& centre, const VecteurU& axeX, const VecteurU& axeY,
              const double& ratio);
    ~Icosaedre();
protected:
    /**
     * Centre de l'Icodaedre, qui est l'origine du système de
     * coordonnées locales, et encore le centre de gravité du solide.
     */
    Coord Centre;
private:
    /**
     * Nombre d'or, utilisé pour la définition des coordonnées des
     * points dans le référentiel local.
     */
    static const double Phi;
    Coord symetries(const Coord& pt, const unsigned int& i) const;
    /**
     * Liste des 20 instances de Plan nécessaire pour la création d'in
     * Icosaedre.
     */
    std::vector< Plan::SharedPtr > listplan;
    /**
     * Liste des instances de FormeComposee intermédiaires nécessaires à
     * l adéfinition de l'Icosaedre.
     */
    std::vector< FormeComposee::SharedPtr > listFC;
};

#endif // ICOSAEDRE_H
